package org.infinispan.container.offheap;
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedAction;
import org.infinispan.commons.CacheException;
import sun.misc.Unsafe;
/**
* @author wburns
* @since 9.0
*/
public class UnsafeHolder {
public static Unsafe UNSAFE = UnsafeHolder.getUnsafe();
@SuppressWarnings("restriction")
private static Unsafe getUnsafe() {
// attempt to access field Unsafe#theUnsafe
final Object maybeUnsafe = AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
try {
final Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
// the unsafe instance
return unsafeField.get(null);
} catch (NoSuchFieldException | SecurityException | IllegalAccessException e) {
return e;
}
});
if (maybeUnsafe instanceof Exception) {
throw new CacheException((Exception) maybeUnsafe);
} else {
return (Unsafe) maybeUnsafe;
}
}
}